package tool;

/**
 * 计算地球上两点的距离
 * 
 * @author xuyuji
 *
 */
public class EarthDistance {

	// 地球半径，单位：km
	private static double EARTH_RADIUS = 6378.137;

	/**
	 * 角度转化弧度
	 * 
	 * @param angle
	 *            角度
	 * @return
	 */
	private static double radian(double angle) {
		return angle * Math.PI / 180.0;
	}

	/**
	 * 获取球面两点距离(弧线距离)
	 * 这里只是演示计算方法，没有做参数校验，如果实际使用需要增加参数校验
	 * @param lat1	点1纬度	[-90,90]
	 * @param lng1	点1经度	[-180,180]
	 * @param lat2	点2纬度
	 * @param lng2	点2经度
	 * @return
	 */
	public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
		double radLat1 = radian(lat1);
		double radLat2 = radian(lat2);
		double radLng1 = radian(lng1);
		double radLng2 = radian(lng2);

		double alpha = radLat1 - radLat2;
		double beta = radLng1 - radLng2;

		//三面角公式，求两点与球心夹角弧度
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(alpha / 2), 2)
				+ Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(beta / 2), 2)));
		
		s = s * EARTH_RADIUS;
		
		//精确到小数点后4位
		s = Math.round(s * 10000) / 10000.0;
		
		return s;
	}

	public static void main(String[] args) {
		//深圳到武汉
		System.out.println(getDistance(30, 114, 22, 114));

		//个人生活距离
		System.out.println(getDistance(31.245087, 121.506656, 31.243481, 121.508883));
	}
}
